﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;


namespace BOL.RendicionVentas
{
    public class GetRendicionVentaList
    {
        int _count;
        public int Count(int idProyecto, 
                        string clienteStr,
                         string numDocumentoStr,
                         DateTime fechaInicio, DateTime fechaFin,
                         int startRowIndex,
                         int maximumRows,
                         string sortExpression)
        {
            return _count;
        }



        

        private IQueryable<RendicionVentaListInfo> ApplySelect_ListInfo()
        {
            var q = from a in DbUtil.Db.RendicionVentaItems
                    select new RendicionVentaListInfo
                    {
                        clienteStr=a.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.Cliente.descripcion,
                        fecha=a.RendicionVenta.fecha,
                        numDocumento=a.RendicionVenta.numDocumento,
                        fechaStr=a.RendicionVenta.fecha.ToShortDateString(),
                        idInternal=a.RendicionVenta.idInternal,
                        idProyecto=a.RendicionVenta.idProyecto,
                        
                        tipoCambio=a.RendicionVenta.tipoCambio,
                        totalBase=a.RendicionVenta.totalBase ,
                        etapa=a.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.descripcion,
                        concepto=a.OrdenVentaFormato.ConceptoItem.descripcion,
                        localizacion=a.OrdenVentaFormato.OrdenVentaItem.UI.UILocalizacion.descripcion,
                        ordenventa=a.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.numDocumento,
                        UI=a.OrdenVentaFormato.OrdenVentaItem.UI.descripcion,
                        totalStr=string.Format("{0}{1:N}",a.RendicionVenta.Moneda.simbol , a.total),
                    };
            return q;
        }
        private IQueryable<RendicionVentaListInfo> ApplySort(IQueryable<RendicionVentaListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                
                case "fecha":
                    q = q.OrderBy(b => b.fecha);
                    break;
                case "fecha DESC":
                    q = q.OrderByDescending(b => b.fecha);
                    break;

                case "tipoCambio":
                    q = q.OrderBy(b => b.tipoCambio);
                    break;
                case "tipoCambio DESC":
                    q = q.OrderByDescending(b => b.tipoCambio);
                    break;

                case "numDocumento":
                    q = q.OrderBy(b => b.numDocumento);
                    break;
                case "numDocumento DESC":
                    q = q.OrderByDescending(b => b.numDocumento);
                    break;
    
                default:
                    q = q.OrderByDescending(b => b.fecha).OrderByDescending(p => p.numDocumento);
                    break;
            }
            return q;
        }



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<RendicionVentaListInfo> Execute(int idProyecto,
                                                            string clienteStr,
                                                            string numDocumentoStr,
                                                            DateTime fechaInicio, 
                                                            DateTime fechaFin,
                                                            int startRowIndex,
                                                            int maximumRows,
                                                            string sortExpression)
        {




            if (!numDocumentoStr.HasValue())
                numDocumentoStr = "";
            if (!clienteStr.HasValue())
                clienteStr = "";


            var q = ApplySelect_ListInfo();


            q = q.Where(a => a.fecha>=fechaInicio 
                        & a.fecha<=fechaFin
                        & a.numDocumento.Contains(numDocumentoStr)
                        & a.idProyecto==idProyecto
                        & a.clienteStr.Contains(clienteStr)
                        );


            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }


    }
}
